import numpy as np

raw_data = [
    ["Name", "StudentID", "Age", "AttendClass", "Score"],
    ["小明", 20131, 10, 1, 67],
    ["小花", 20132, 11, 1, 88],
    ["小菜", 20133, None, 1, "98"],
    ["小七", 20134, 8, 1, 110],
    ["花菜", 20134, 98, 0, None],
    ["刘欣", 20136, 12, 0, 12]
  ]


def numpy_clean_data():
  # 只处理数据行，排除标题行
  data_rows = raw_data[1:]  # 排除第一行标题
  data = np.array(data_rows)
  
  # numpy数组切片操作：[:, 0]表示取所有行的第0列（第一列）数据
  # 语法说明：[行索引, 列索引]
  # : 表示选择所有行
  # 0 表示选择第0列（即第一列）
  # 这将返回一个一维数组，包含所有学生的姓名
  sid = data[:, 0]
  unique, counts = np.unique(sid, return_counts=True)
  print(counts)
  print(unique[counts > 1])

  data[4, 1] = 20135
  print(data)

  # 打印第3列（年龄列）的数据类型和内容，用于调试
  print("第3列数据:", data[:, 2])
  print("第3列数据类型:", data[:, 2].dtype)
  
  # 将第3列转换为浮点型，以便使用np.isnan
  # 首先将None替换为np.nan
  age_col = data[:, 2].copy()
  # 将字符串'None'替换为np.nan
  age_col[age_col == 'None'] = np.nan
  age_col[age_col == None] = np.nan
  age_data = age_col.astype(float)
  is_nan = np.isnan(age_data)
  print("is_nan:", is_nan)
  nan_idx = np.argwhere(is_nan)

  # 计算有数据的平均年龄，用 ~ 符号可以 True/False 对调
  valid_ages = age_data[~is_nan]
  mean_age = valid_ages.mean()
  print("有数据的平均年龄：", mean_age)
  
  # 用平均年龄填充空值
  data[nan_idx.flatten(), 2] = mean_age
  print("填充后的数据：")
  print(data)

def numpy_clean_data1():
  data_process = []
  for i in range(len(raw_data)):
    if i == 0:
      continue  # 不要首行字符串
    # 去掉首列名字
    data_process.append(raw_data[i][1:])
  data = np.array(data_process, dtype=np.float64)
  print("data.dtype", data.dtype)
  print(data)

def data_clean_up():
  print(data)
  print(data.dtype)

  test1 = np.array([1, 2, 3])
  test2 = np.array([1.1, 2.3, 3.4])
  test3 = np.array([1, 2, 3], dtype=np.float64)
  print("test1.dtype", test1.dtype)
  print("test2.dtype", test2.dtype)
  print("test3.dtype", test3.dtype)

  print("test2 > 2 ", test2 > 2)
  # print("data > 2", data > 2)  # 这里会报错

if __name__ == '__main__':
  numpy_clean_data()